package com.example.commons.exception;


import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

@Slf4j
@RestController
@RestControllerAdvice
public class ResponseWrapper implements ResponseBodyAdvice<Object> {

    /*
     * 选择是否执行 beforeBodyWrite 方法，返回 true 执行，false 不执行.通过 supports 方法，可以选择对哪些类或方法的 Response 进行处理，其余的
     * 则不处理。
     * 1、当且仅当本方法返回 true 时，下面的 beforeBodyWrite 方法才会执行
     * 2、可以直接返回 true，此时全部经过下面的 beforeBodyWrite 方法。如下演示的是自己包下面的控制器方法返回时才进行增强。
     *
     * @param returnType    返回值类型
     * @param converterType 转换器
     * @return
     */
    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        return true;
    }

    /*
     * @param body                  响应对象(response)中的响应体
     * @param returnType            控制器方法的返回类型
     * @param selectedContentType   通过内容协商选择的内容类型
     * @param selectedConverterType 选择写入响应的转换器类型
     * @param request               当前请求
     * @param response              当前响应
     * @return 返回传入的主体或修改过的(可能是新的)主体
     */
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        log.info(JSONObject.toJSONString(body));
        return body;
    }
}
